<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>Document</title>
  </head>
  <body>
    <script>
      // 一,原型链继承
      // 1.父构造函数
      function Father(uanme, age) {
        // this指向父构造函数的对象实例
        this.uanme = uanme;
        this.age = age;
      }
      Father.prototype.say = function () {
        console.log("赚钱1000");
      };

      // 2.子构造函数
      function Son(uname, age) {
        // (继承属性)this指向子构造函数的对象实例
        Father.call(this, uname, age);
      }
      // (继承方法)将父构造函数的实例对象赋给子构造函数的原型
      Son.prototype = new Father();
      // 如果利用了对象的形式修改了原型对象,别忘了利用constructor指回原来的构造函数
      Son.prototype.constructor = Son;
      // 这个是子构造函数专门的方法
      Son.prototype.exam = function () {
        console.log("孩子要考试");
      };
      const son = new Son("大黄", 5);
      console.log(son);
      console.log(Father.prototype);

      // 共有的属性写在构造函数里面,共有的方法写在原型对象上
      // 原型链继承方法:需要将方法挂载在父构造函数的原型上,再把父构造函数的实例对象赋值给子构造函数的原型上就可以实现继承方法
      // 原型链的主要作用就是共享方法

      // 1.为什么原型链不能继承属性?
      // 原型链继承属性的话会被所有实例所共享,还有就是创建子类的时候不能传递参数

      // 2.为什么不能直接把父构造函数的原型对象给到子构造函数的原型对象呢?
      // 这样修改有问题,因为我们修改了子原型对象,那么父原型对象就会跟着改变
    </script>
  </body>
</html>
